package cn.hh.ymcc.service.impl;

import cn.hh.ymcc.domain.CourseOrder;
import cn.hh.ymcc.domain.PayFlow;
import cn.hh.ymcc.domain.PayOrder;
import cn.hh.ymcc.dto.Order2payOrderParamDto;
import cn.hh.ymcc.enums.GlobalExceptionCode;
import cn.hh.ymcc.mapper.PayOrderMapper;
import cn.hh.ymcc.service.IPayFlowService;
import cn.hh.ymcc.service.IPayOrderService;
import cn.hh.ymcc.util.AssertUtil;
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.payment.common.models.AlipayTradeCloseResponse;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.awt.*;
import java.util.Date;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author huang.hao
 * @since 2025-05-12
 */
@Slf4j
@Service
public class PayOrderServiceImpl extends ServiceImpl<PayOrderMapper, PayOrder> implements IPayOrderService {

    @Autowired
    private IPayFlowService payFlowService;



//    /**
//     * 根据订单号查询订单
//     *
//     * @param orderNo
//     * @return
//     */
//    public CourseOrder selectByOrderNo(String orderNo) {
//        Wrapper<CourseOrder> wrapper = new EntityWrapper<>();
//        // 根据order_no字段查询orderNo对象
//        wrapper.eq("order_no", orderNo);
//        return selectOne(wrapper);
//    }


    /**
     *  消费消息,保存支付单
     * @param orderDto
     */
    @Override
    public void savePayOrder(Order2payOrderParamDto orderDto) {
        // 创建一个支付订单对象payOrder
        PayOrder payOrder = new PayOrder();
        // 使用BeanUtils,将orderDto拷贝给,支付订单对象payOrder
        BeanUtils.copyProperties(orderDto,payOrder);
        // 支付订单对象设置创建时间
        payOrder.setCreateTime(new Date());
        // 支付订单对象设置支付状态
        payOrder.setPayStatus(PayOrder.STATE_WAITE_PAY); // 待支付
        // 添加支付订单
        insert(payOrder);

    }

    /**
     *  修改支付单状态,保存支付流水
     * @param payOrder
     * @param payFlow
     */
    @Override
    public void updatePayOrderAndInsertPayFlow(PayOrder payOrder, PayFlow payFlow) {
        // 查询出支付单
        PayOrder tmp = selectById(payOrder.getId());
        // 判断支付单是否为等待支付, 处理消息的幂等性
        boolean isWaitPay = tmp.getPayStatus() == PayOrder.STATE_WAITE_PAY;
        AssertUtil.isTrue(isWaitPay,GlobalExceptionCode.PAY_ORDER_STATE_ERROR.getMessage());
        // 修改支付单
        updateById(payOrder);
        // 保存支付流水
        payFlowService.insert(payFlow);

    }

    /**
     *  取消支付单,关闭支付宝交易
     * @param orderNo
     */
    @Override
    public void payTimeOutCancelOrder(String orderNo) {
        // 查询出订单号
        Wrapper<PayOrder> wrapper = new EntityWrapper<>();
        wrapper.eq("order_no",orderNo);
        PayOrder payOrder = selectOne(wrapper);
        // 判断订单号是否存在
        if (payOrder == null){
            return;  // 订单号不存在,直接返回,不要在给我们发送消息处理了
        }
        // 判断支付状态是否为待支付
        boolean isWaitPay = payOrder.getPayStatus() == PayOrder.STATE_WAITE_PAY;
        if (!isWaitPay){ // 如果不是待支付
            return; // 直接返回,不要在发送消息给我们处理了
        }
        // 到这里,说明订单存在且支付状态为待支付
        payOrder.setPayStatus(PayOrder.STATE_CANCEL); // 修改支付单的支付状态为取消订单
        updateById(payOrder); // 修改数据库支付单
        // 关闭支付宝交易
        try {
             Factory.Payment.Common().close(orderNo);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("调用支付宝关闭交易失败! 我们通过支付宝异步通知中去退款解决");
        }
    }


}
